package br.ufmt.model;

import java.util.ArrayList;
import java.util.List;

import br.ufmt.exception.CidadeException;

public class Cidade {

	final static ArrayList<Cidade> cidades = new ArrayList<Cidade>();
	
	private Estado uf;
	private String nome;
	
	/**
	 * Cria um objeto Cidade
	 * @param uf Objeto Estado a qual pertence a cidade
	 * @param nome String descrevendo o nome da cidade
	 * @throws CidadeException
	 */
	public Cidade (Estado uf, String nome) throws CidadeException {
		setUf(uf);
		setNome(nome);
	}
	
	public Estado getUf() {
		return uf;
	}
	
	public String getNome() {
		return nome;
	}
	
	/**
	 * Modifica a unidade federativa da cidade
	 * @param uf
	 * @throws CidadeException
	 */
	public void setUf(Estado uf) throws CidadeException {
		if (uf==null) throw new CidadeException(CidadeException.ESTADO_OBRIGATORIO);
		this.uf = uf;
	}
	
	/**
	 * Modifica o nome da cidade
	 * @param nome
	 * @throws CidadeException
	 */
	public void setNome(String nome) throws CidadeException {
		if (nome==null || nome.length()==0) throw new CidadeException(CidadeException.NOME_OBRIGATORIO);
		if (nome.length()<=3) throw new CidadeException(CidadeException.NOME_TAMANHO);
		this.nome = nome;
	}

	/**
	 * Guarda uma refer�ncia do objeto em um vetor
	 */
	public void salvar() {
		if (!cidades.contains(this))
			cidades.add(this);
	}
	
	/**
	 * Remove a refer�ncia do objeto do vetor
	 */
	public void excluir() {
		cidades.remove(this);
	}
	
	/**
	 * Busca Cidades de um determinado estado
	 * @param uf estado que se deseja obter a rela��o de cidades
	 * @return Lista de Cidades do Estado informado
	 */
	public static List<Cidade> getCidadePorEstado(Estado uf) {
		ArrayList<Cidade> resultado = new ArrayList<Cidade>();
		for (Cidade c: cidades) {
			if (c.getUf().equals(uf)) resultado.add(c);
		}
		return resultado;
	}
	
	/**
	 * Busca exatamente uma �nica cidade pelo nome
	 * @param nome nome exato da cidade
	 * @return Cidade
	 */
	public static Cidade getCidadePorNome(String nome) {
		for (Cidade c: cidades) {
			if (c.getNome().equalsIgnoreCase(nome)) return c;
		}
		return null;
	}
	
	@Override
	public String toString() {
		return getNome() + " (" + uf + ")";
	}
	
	static {
		try {
			new Cidade(Estado.getEstadoPorSigla("DF"),"Bras�lia").salvar();
			new Cidade(Estado.getEstadoPorSigla("MT"),"Cuiab�").salvar();
			new Cidade(Estado.getEstadoPorSigla("MT"),"V�rzea Grande").salvar();
			new Cidade(Estado.getEstadoPorSigla("MS"),"Campo Grande").salvar();
			new Cidade(Estado.getEstadoPorSigla("MS"),"Corumb�").salvar();
			new Cidade(Estado.getEstadoPorSigla("SP"),"S�o Carlos").salvar();
			new Cidade(Estado.getEstadoPorSigla("SP"),"S�o Paulo").salvar();
		} catch (CidadeException e) {
			e.printStackTrace();
		}
	}
}
